查看原文
其他

Python实现微信自动回复

爬虫俱乐部 Stata and Python数据分析 2023-10-24

本文作者:智淼,中南财经政法大学统计与数学学院

本文编辑:胡艺粼

技术总编:孙一博

Stata and Python 数据分析

爬虫俱乐部Stata基础课程Stata进阶课程Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~
引言

微信接收的消息太多,不想回复?朋友很需要和我聊天,但是实在没时间?微信自动回复能解放你的双手。但由于目前微信网页版限制登陆,微信个人号接口失效,因此很难直接调用微信。本文提供一个简便通用的方式,接入智能聊天机器人,利用Python实现PC端微信的自动回复。

01导入第三方库

pyautogui通过控制鼠标和键盘来实现Python与其他应用的交互,能够查找屏幕上内容位置,实现鼠标点击、键盘控制等功能,因此即使频繁操作微信,也不会有封号的风险。而且适用于Windows、macOS和Linux系统。

pyperclip用于复制和粘贴剪切板上的内容,代替只能输入英文的pyautogui.typewrite。

import pyautogui as ptimport pyperclipfrom time import sleepimport urllibimport requests
02捕捉未读消息

首先,收到新消息后会出现一个小红点,截图命名为unread1.jpg,存放到当前文件夹下。调用pt.locateOnScreen通过指示图片(unread1.jpg)定位新消息的位置,pt.click点击上述位置,这样就实现了“收到新消息-进入发送人聊天界面”。

def move_pointer(): position1 = pt.locateOnScreen("unread1.jpg",grayscale=False, confidence=.8) x = position1[0] y = position1[1] pt.click(x/2, y/2+20, duration=0.3) # duration设置鼠标移动的时间

需要说明的几点:在locateOnScreen()中使用confidence关键字参数,可以允许模糊匹配(需要安装OpenCV,如下命令)。此外,传递grayscale=True可以提供轻微的加速(大约30%左右),这会降低图像和屏幕截图的颜色饱和度,加快定位速度,但可能会导致误报匹配。因此如果鼠标没有在正确的位置上点击时,可以将confidence在0.6-0.9的范围内进行调试,或者更改grayscale=False。

pip install opencv_python

一般来说,为了更精确地点击某个位置,需要微调传输到pt.click()中的位置。需要注意的是,如果你的电脑使用了视网膜显示屏,屏幕截图输出的像素会翻倍,因此要除以2后再进行调整。

03复制对方的消息

接下来,我们要将对方发送的信息复制至剪贴板。用对话框图片(chatbox.png)进行定位。如果返回的received_message不是本次复制的内容,可能是没有设置sleep()。

def copy(): position2 = pt.locateOnScreen("chatbox.png",grayscale=True, confidence=.8) a = position2[0] b = position2[1] pt.moveTo(a/2+20,b/2-20, duration = 0.3) pt.rightClick() # 右键点击 pt.moveRel(7,7, duration= 0.3) # 鼠标移动至复制键 pt.click() # 点击 sleep(0.5) # 等待消息复制至剪贴板 received_message = pyperclip.paste() return received_message
04自动输出消息
4.1 调用API实现聊天

调用聊天机器人API实现真正意义上的“聊天”。演示中使用的是青云客聊天机器人API,请求地址为http://api.qingyunke.com/api.php,直接使用即可。

def qingyunke(msg): url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg{}'.format(urllib.parse.quote(msg)) html = requests.get(url) return html.json()["content"]
4.2 发送消息

我们定位到对话框(send.png)并点击,等待发送消息。pyperclip.copy(reply)将上一步中消息复制到剪切板,pyperclip.paste()将剪贴板内容粘贴到对话框中。如果paste()不能实现,可以改用热键组合pt.hotkey('command', 'v')或pt.hotkey('ctrl', 'v')。最后再调用回车键就能实现消息的发送了。

def send_msg(reply): location3= pt.locateOnScreen("send.png", confidence=.9) x = location3[0] y = location3[1] pt.moveTo(x/2, y/2, duration=0.5) pt.click() pyperclip.copy(reply) #可以输入中文 # pyperclip.paste() pt.hotkey('command', 'v') #粘贴 pt.press('enter',presses=3)
05调用函数进行循环

最后,调用上述函数进行对微信新消息的持续监控。首先,出现小红点(未读消息)时,进入对话框并进行新对话。其次,当没有新对话人发来消息时,不会出现小红点,但当前对话人发来新消息时,仍能捕捉到并进行回复。这样就能实现多个联系人的同时对话。

count = 0wechat = pt.locateOnScreen("open.png", confidence=.8)while count<300: red = pt.locateOnScreen("unread1.jpg",grayscale=True, confidence=.8) if not wechat: # 检测是否打开微信 print("【请打开微信并放置在桌面上】") break elif red != None: # 新的对话 move_pointer() msg= copy() print("新消息:"+msg) reply= qingyunke(msg) send_msg(reply) print("我的回复:"+ reply) sleep(0.2) elif pt.locateOnScreen("chat.png", grayscale=False) != None: # 当前对话的联系人发送新消息 msg= copy() print("新消息:"+msg) reply= qingyunke(msg) send_msg(reply) print("我的回复:"+ reply) sleep(0.2) else: print("【没有新消息】") sleep(1) count+= 1
效果展示

控制台展示如下:

微信页面效果如下:

定位图片需要有明显的特征,大家需要根据自己的微信界面进行截图保存,参考如下(分别对应代码中的unread1.jpg、chatbox.png、send.png、send.png):

除了以上展示外,还可以加入更多功能,比如调出微信聊天记录、使用ChatBot训练出更符合自己语气的聊天机器人,或者可以设置特定联系人进行自动回复。大家快来试试吧~

重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!







往期推文推荐 告诉python,我想“狂飙”了——线程池与异步协程为爬虫提速高级函数——map()和reduce()

Stata绘制条形图的进阶用法

快来看看武汉的房价是不是又双叒叕涨了!Python 常见内置函数(二)

Stata绘制饼形图的进阶用法

Python标准库--logging模块盲区探索——Stata的读写极限Camelot提取PDF表格:一页多表、多页一表

Stata绘图系列——条形图绘制

Python常见内置函数(一)Stata绘图系列——饼形图绘制【爬虫实战】深交所服务业年报数据

“挂羊头卖狗肉”?

Python与excel交互--xlsxwriter模块

cnmapsearch——离公司最近的快餐店在哪

Python中的异常处理 Python交互式数据可视化——酷炫的Altair库
     关于我们 

   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存